航行日志

生存游戏的一个SQL BUG

几年前玩过一个《BR生存游戏》的WEB GAME。大逃杀类型,这几天想起来,发现还有论坛开着个游戏,玩的人还有些。不过,这个游戏应该好久没有更新修复过了,对SQL的” ‘ ” 的问题没有注意处理,这是大忌。

265的网站由于一个死亡留言 “Myhands Don’t want start again” 导致SQL执行失败,游戏当了2天了。由于他的SQL调试没有关,所以错误信息泄露,BRA info: MySQL Query Error

Time: 2012-2-20 6:13am
Script:

SQL: INSERT INTO bra_winners (gid,name,pass,type,endtime,gd,sNo,icon,club,hp,mhp,sp,msp,att,def,pls,lvl,exp,money,bid,inf,rage,pose,tactic,killnum,state,wp,wk,wg,wc,wd,teamID,teamPass,wep,wepk,wepe,weps,arb,arbk,arbe,arbs,arh,arhk,arhe,arhs,ara,arak,arae,aras,arf,arfk,arfe,arfs,art,artk,arte,arts,itm0,itmk0,itme0,itms0,itm1,itmk1,itme1,itms1,itm2,itmk2,itme2,itms2,itm3,itmk3,itme3,itms3,itm4,itmk4,itme4,itms4,itm5,itmk5,itme5,itms5,motto,wmode,vnum,gtime,gstime,getime,hdmg,hdp,hkill,hkp) VALUES (‘4273’,’亦陽’,’×××××××××××××’,’0’,’1329544800’,’m’,’1’,’32’,’2’,’376’,’394’,’22’,’300’,’172’,’176’,’5’,’22’,’396’,’2590’,’97’,’p’,’22’,’3’,’3’,’97’,’’,’0’,’380’,’0’,’0’,’33’,’’,’’,’■隆基弩斯之枪■’,’WK’,’436’,’4’,’锁帷子’,’DB’,’37’,’19’,’传家头盔’,’DH’,’25’,’19’,’★RoseMystica★’,’DA’,’30’,’20’,’军靴β’,’DF’,’10’,’28’,’士兵证明书’,’AW’,’20’,’10’,’旗袍’,’DB’,’10’,’20’,’’,’’,’0’,’0’,’★炸药★’,’WD’,’50’,’18’,’圆形罐头’,’HS’,’200’,’11’,’电池’,’Y’,’1’,’2’,’笔记本电脑’,’Y’,’1’,’2’,’Myhands Don’t want start again’,’2’,’44’,’6900’,’1329537900’,’1329544800’,’’,’’,’97’,’亦陽’)
Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘t want start again’,’2’,’44’,’6900’,’1329537900’,’1329544800’,’’,’’,’97’,’亦陽’ at line 1
Errno.: 1064

问题出在胜利时,记录胜利者信息的时候。

其实修复比简单。

修复方式:

在include目录下的system.func.php 里,把

$pdata[‘motto’] =$db->result($result2, 0);
改为

$pdata[‘motto’] = str_replace(“‘“, “‘’”, $db->result($result2, 0));
即可。

存档的其他部分由于都是系统内部数据,不会有单独 ‘ 出现。当然,能保护起来是最好的。